package com.liuh.fram.util;

import java.text.ParseException;
import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Hours;
import org.joda.time.Minutes;
import org.joda.time.Months;
import org.joda.time.Seconds;
import org.joda.time.Years;
import org.joda.time.format.DateTimeFormat;

import com.liuh.fram.log.Log4jLogExtra;

/**
 * @note 日期常用方法
 * @author liuh
 * */
public class DateKitExt {

	static Log4jLogExtra log4jExtra = new Log4jLogExtra(DateKitExt.class);

	public static Date StringToDate(String dateString, String format) {
		DateTime dt2 = DateTimeFormat.forPattern(format).parseDateTime(
				dateString);
		Date date = dt2.toDate();
		return date;
	}

	/**
	 * 获得当前时间，格式yyyy-MM-dd hh:mm:ss
	 * 
	 * @param format
	 * @return
	 */
	public static String getCurrentDateTime() {
		DateTime dt2 = new DateTime();
		return dt2.toString("yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 获得当前时间，格式自定义
	 * 
	 * @param format
	 * @return
	 */
	public static String getCurrentDate(String formatStr) {
		DateTime dt2 = new DateTime();
		return dt2.toString(formatStr);
	}

	/**
	 * 获得昨天时间，格式自定义
	 * 
	 * @param format
	 * @return
	 */
	public static String getYesterdayDate(String formatStr) {
		DateTime dt = new DateTime();
		dt = dt.minusDays(1);// 前面两天
		return dt.toString(formatStr);
	}

	/**
	 * @param date1
	 *            需要比较的时间 不能为空(null),需要正确的日期格式 ,如：2009-09-12
	 * @param date2
	 *            被比较的时间 为空(null)则为当前时间
	 * @param stype
	 *            返回值类型 0为多少天，1为多少个月，2为多少年,3为小时，4为分钟，5为秒
	 * @return 举例： compareDate("2009-09-12", null, 0);//比较天
	 *         compareDate("2009-09-12", null, 1);//比较月
	 *         compareDate("2009-09-12", null, 2);//比较年
	 */
	public static int compareDate(String startDay, String endDay, int stype,
			String formatStr) {
		int n = 0;
		DateTime start = DateTimeFormat.forPattern(formatStr).parseDateTime(
				startDay);
		DateTime end = DateTimeFormat.forPattern(formatStr).parseDateTime(
				endDay);// 结束时间
		switch (stype) {
		case 0:
			n = Days.daysBetween(start, end).getDays();
			break;
		case 1:
			n = Months.monthsBetween(start, end).getMonths();
			break;
		case 2:
			n = Years.yearsBetween(start, end).getYears();
			break;
		}
		return n;
	}

	/**
	 * 判断时间是否符合时间格式
	 */
	public static boolean isLegalDateString(String date, String dateFormat) {
		if (date != null) {
			java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(
					dateFormat);
			format.setLenient(false);
			try {
				format.format(format.parse(date));
			} catch (ParseException e) {
				return false;
			}
			return true;
		}
		return false;
	}

	/**
	 * 实现给定某日期，判断是星期几 date:必须yyyy-MM-dd格式
	 */
	public static String getWeekday(String date) {
		DateTime dt = new DateTime();
		return dt.dayOfWeek().getAsText();
	}

	/**
	 * 用来全局控制 上一周，本周，下一周的周数变化
	 */
	private static int weeks = 0;

	/**
	 * 获得当前日期与本周一相差的天数
	 */
	private static int getMondayPlus() {
		// 获得今天是一周的第几天，星期日是第一天，星期二是第二天......
		int dayOfWeek = DateTime.now().getDayOfWeek();
		return 1 - dayOfWeek;
	}

	/**
	 * 获得本周星期一的日期
	 */
	public static String getCurrentMonday(String format) {
		int mondayPlus = getMondayPlus();
		return DateTime.now().plusDays(mondayPlus).toString(format);
	}

	/**
	 * 获得上周星期一的日期
	 */
	public static String getPreviousMonday(String format) {
		weeks--;
		int mondayPlus = getMondayPlus();
		return DateTime.now().plusDays(mondayPlus + 7 * weeks).toString(format);
	}

	/**
	 * 获得下周星期一的日期
	 */
	public static String getNextMonday(String format) {
		weeks++;
		int mondayPlus = getMondayPlus();
		return DateTime.now().plusDays(mondayPlus + 7 * weeks).toString(format);
	}

	/**
	 * 获得相应周的周日的日期 此方法必须写在getCurrentMonday，getPreviousMonday或getNextMonday方法之后
	 */
	public static String getSunday(String format) {
		int mondayPlus = getMondayPlus();
		return DateTime.now().plusDays(mondayPlus + 7 * weeks + 6)
				.toString(format);
	}

	/**
	 * 数值型的时间改为字符串型时间
	 * 
	 * @param time
	 * @return
	 */
	public static String getTime(long time) {
		return new DateTime(time).toString("yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 传入"yyyy-MM-dd HH:mm:ss"格式字符串,传出从1970 年~~~ 至dateString表示时刻之间的ms。
	 * 
	 * @return
	 */
	public static long getTimeMillis(String dateString) {
		DateTime start = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
				.parseDateTime(dateString);
		return start.getMillis();
	}

	/**
	 * 获得后N天的时间，格式自定义
	 * 
	 * @param format
	 * @return
	 */
	public static String getDelayDayDate(String format, int delay) {
		return DateTime.now().plusDays(delay).toString(format);
	}

	/**
	 * 获得后N小时的时间，格式自定义
	 * 
	 * @param format
	 * @param delay
	 * @return
	 */
	public static String getDelayHourDate(String format, int delay) {
		return DateTime.now().plusHours(delay).toString(format);
	}

	/**
	 * @param date1
	 *            需要比较的时间 不能为空(null),需要正确的日期格式 ,如：2009-09-12 16:24
	 * @param date2
	 *            被比较的时间 为空(null)则为当前时间
	 * @param stype
	 *            0为比较小时，1为比较分钟。
	 * @return
	 */
	public static int compareTime(String startDay, String endDay, int stype,
			String formatStr) {
		int n = 0;
		DateTime start = DateTimeFormat.forPattern(formatStr).parseDateTime(
				startDay);
		DateTime end = DateTimeFormat.forPattern(formatStr).parseDateTime(
				endDay);// 结束时间
		switch (stype) {
		case 0:
			n = Hours.hoursBetween(start, end).getHours();
			break;
		case 1:
			n = Minutes.minutesBetween(start, end).getMinutes();
			break;
		case 2:
			n = Seconds.secondsBetween(start, end).getSeconds();
			break;
		}
		return n;
	}

	public static void main(String[] args) {
		System.out.println(DateKitExt.compareDate("2013-10-28 17:52:21",
				"2018-11-28 18:52:21", 3, "yyyy-MM-dd HH:mm:ss"));
		System.out.println(DateKitExt.getSunday("yyyy-MM-dd"));
		System.out.println(DateKitExt
				.getDelayDayDate("yyyy-MM-dd HH:mm:ss", 10));
	}
}
